package com.movie.mapper;

import com.movie.entity.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Mapper
public interface OrderMapper {

    /**
     * 获取所有订单
     */
    List<Order> findAll();

    /**
     * 根据ID查找订单
     */
    Order findById(@Param("id") Long id);

    /**
     * 根据用户ID查找订单
     */
    List<Order> findByUserId(@Param("userId") Long userId);

    /**
     * 插入新订单
     */
    int insert(Order order);

    /**
     * 更新订单状态
     */
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);

    /**
     * 获取订单总数
     * @return 订单总数
     */
    int count();

    /**
     * 获取用户订单总数
     * @param userId 用户ID
     * @return 订单总数
     */
    int countByUserId(@Param("userId") Long userId);

    /**
     * 保存订单
     */
    int save(Order order);

    /**
     * 更新订单
     */
    int update(Order order);

    /**
     * 删除订单
     */
    int deleteById(Long id);

    /**
     * 根据条件搜索订单
     */
    List<Order> search(@Param("orderNumber") String orderNumber,
                       @Param("username") String username,
                       @Param("startDate") LocalDate startDate,
                       @Param("endDate") LocalDate endDate);

    /**
     * 分页查询所有订单
     * @param offset 跳过的记录数
     * @param limit 每页记录数
     * @return 分页订单列表
     */
    List<Order> findAllPaged(@Param("offset") int offset, @Param("limit") int limit);

    /**
     * 获取所有订单的总数
     * @return 所有订单的总记录数
     */
    int countAll();

    /**
     * 查询超过指定时间未支付的订单
     * @param cutoffTime 截止时间
     * @return 超时未支付的订单列表
     */
    List<Order> findUnpaidOrdersOlderThan(@Param("cutoffTime") LocalDateTime cutoffTime);

    /**
     * 获取用户已完成订单的总消费金额
     * @param userId 用户ID
     * @return 总消费金额
     */
    BigDecimal getTotalSpentByUserId(@Param("userId") Long userId);

    /**
     * 获取用户电影类型分布
     * @param userId 用户ID
     * @return 电影类型及其观看次数的映射
     */
    List<Map<String, Object>> getGenreDistributionByUserId(@Param("userId") Long userId);

    /**
     * 获取用户观影时间分布
     * @param userId 用户ID
     * @return 月份及其观看次数的映射
     */
    List<Map<String, Object>> getWatchTimeDistributionByUserId(@Param("userId") Long userId);

    /**
     * 获取用户最近的观影记录
     * @param userId 用户ID
     * @param limit 限制记录数
     * @return 最近的观影记录
     */
    List<Order> getRecentWatchesByUserId(@Param("userId") Long userId, @Param("limit") int limit);
}
